// 根据 逆波兰表示法，求表达式的值。

// 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
/**
 * @param {string[]} tokens
 * @return {number}
 */
//成功
var evalRPN = function(tokens) {
    let stk = [];
    for (let i = 0; i < tokens.length; i++) {
        console.log(stk)
        if (isNumber(tokens[i])) {
            stk.push(tokens[i]);
        } else {
            let num1 = stk.pop();
            let num2 = stk.pop();
            let sum = count(num1, num2, tokens[i]);
            stk.push(sum);
        }
    }
    return stk[0]
};

function isNumber(item) {
    let arr = ["+", "-", "*", "/"];
    return !arr.includes(item);
}

function count(num1, num2, dash) {
    num1 = parseInt(num1);
    num2 = parseInt(num2)
    let sum;
    if (dash == "+") {
        sum = num2 + num1;
    } else if (dash == "-") {
        sum = num2 - num1;
    } else if (dash == "*") {
        sum = num2 * num1;
    } else if (dash == "/") {
        sum = num2 / num1 | 0; //注意这里要判断可能等于0
    }
    return sum
}
// 更巧妙的方法：用map进行映射

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    const s = new Map([
        ["+", (a, b) => a * 1 + b * 1],
        ["-", (a, b) => b - a],
        ["*", (a, b) => b * a],
        ["/", (a, b) => (b / a) | 0]
    ]);
    const stack = [];
    for (const i of tokens) {
        if (!s.has(i)) {
            stack.push(i);
            continue;
        }
        stack.push(s.get(i)(stack.pop(), stack.pop()))
    }
    return stack.pop();
};